import router from '@/router'
import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: '', // 移除 /api 前缀，因为已经包含在 API 端点 URL 中
  timeout: 15000, // 请求超时时间
  withCredentials: true, // 允许携带cookies
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
})

// request拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token')
    // 只对需要认证的接口添加 token
    const protectedPaths = ['/api/orders', '/api/customers/points']
    const isProtectedPath = protectedPaths.some(path => config.url.startsWith(path))
    if (token && isProtectedPath) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    console.log('Request URL:', config.url)
    console.log('Full Request Config:', config)
    return config
  },
  error => {
    console.error('Request error:', error)
    return Promise.reject(error)
  }
)

// response拦截器
service.interceptors.response.use(
  response => {
    console.log('Response:', response)
    const res = response.data
    return res
  },
  error => {
    // 只在控制台打印技术错误信息
    console.error('Error details:', {
      status: error.response?.status,
      data: error.response?.data,
      config: error.config
    })
    
    // 处理错误消息
    let message = '网络错误'
    if (error.response) {
      const errorData = error.response.data
      
      // 处理登录相关错误
      if (error.response.status === 400 && error.config.url.includes('/login')) {
        // 直接使用后端返回的用户友好消息
        message = typeof errorData === 'string' ? errorData : '用户名或密码错误'
      } else {
        switch (error.response.status) {
          case 401:
            message = '请先登录'
            localStorage.removeItem('token')
            router.push('/login')
            break
          case 403:
            message = '没有权限访问'
            break
          case 404:
            message = '请求的资源不存在'
            break
          case 408:
            message = '请求超时，请重试'
            break
          case 500:
            message = '服务器出错，请稍后再试'
            break
          default:
            message = typeof errorData === 'string' ? errorData : '操作失败，请重试'
        }
      }
    }

    ElMessage({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(new Error(message))
  }
)

// 封装GET请求
export function get(url, params) {
  return service({
    url,
    method: 'get',
    params
  })
}

// 封装POST请求
export function post(url, data) {
  return service({
    url,
    method: 'post',
    data
  })
}

// 封装PUT请求
export function put(url, data) {
  return service({
    url,
    method: 'put',
    data
  })
}

// 封装DELETE请求
export function del(url, params) {
  return service({
    url,
    method: 'delete',
    params
  })
}

export default service 